home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 July / EnigmA AMIGA RUN 20 (1997)(G.R. Edizioni)(IT)[!][issue 1997-07 & 08][EAR-CD IV].iso / earcd / biz / dbase / ax.lha / Ax / Rexx / FTP_DaFTP.ax < prev    next >
Text File  |  1997-03-15  |  9KB  |  362 lines

  1. /*
  2.  * Ax ARexx-FTP interface script
  3.  * FTP client: DaFTP
  4.  * $VER: FTP_DaFTP.ax 1.0 (6.12.96)
  5.  *
  6.  * Version 1.0
  7.  * by Paul A. Schifferer
  8.  * Copyright 1996 © Isengard Developments
  9.  *
  10.  * This script is freely distributable and modifiable.  You are authorized to
  11.  * modify it to suit your needs.  Isengard Developments makes no warranty,
  12.  * express or implied, for its usability or reliability in its original or
  13.  * modified form.
  14.  *
  15.  * This script takes an optional list of files to retrieve with the FTP client
  16.  * program noted above.  If 'files' aren't specified on the command line, the
  17.  * script will attempt to interface with Ax, using the ARexx port name "AXFTP"
  18.  * to get files.  Alternatively, 'files' can be "LIST=filename", which
  19.  * specifies the list of files to use (see below).  If files are specified on
  20.  * the command line for this script, then the first parameter must be the site
  21.  * name, the second the base directory, and all subsequent parameters are
  22.  * files in the form of 'path/filename' (relative to the base path).
  23.  *
  24.  * The file list is in the following format:
  25.  *
  26.  * The first line is the site from which to retrieve the files.  The second
  27.  * line is the base directory to use, e.g., '/pub/aminet', without the
  28.  * trailing slash.  This dir should always be an absolute path, i.e., with
  29.  * the beginning slash.
  30.  *
  31.  * All subsequent lines are files to retrieve in the form of 'path/filename',
  32.  * e.g., "biz/dbase/Ax.lha".  'path' need not be specified, if the file is
  33.  * located in the base directory.  Note that all paths should be specified
  34.  * relative to the base directory, but this is not a requirement.  Absolute
  35.  * pathnames may be used.
  36.  *
  37.  * A line with three hashes ('###') ends the filelist.  Everything thereafter
  38.  * is ignored.
  39.  */
  40.  
  41. options results
  42. signal on syntax
  43. signal on error
  44.  
  45. parse arg files
  46.  
  47. /*
  48.  * Is Ax running?
  49.  */
  50. if (length(files) = 0) & ~show('P',"AX") then do
  51.   say "Ax must be running to use this script!"
  52.   exit 20
  53.   end
  54.  
  55. /*
  56.  * Set up some variables.
  57.  */
  58. clientname = "DaFTP"
  59. scriptname = "FTP_"clientname".ax"
  60. clientpath = "DaFTP"
  61. clientopts = "ICONIFIED"
  62. clientport = "DAFTP.1"
  63. ftpport = ""
  64.  
  65. /*
  66.  * Command variables.
  67.  *
  68.  * The following variables are commands that would be issued to the FTP client
  69.  * program.  The construct is simple:  "command parameter options".  Place
  70.  * the client's command portion in the variable <a-cmd>cmd, where <a-cmd> is
  71.  * the type of command.  This script will place after the command any parameters
  72.  * that are necessary.  If the command has options to be specified, place them
  73.  * in the variable <a-cmd>opts.  These will be placed at the end of the command,
  74.  * after the parameters.
  75.  *
  76.  * For example, the "GET" command for DaFTP allows you to specify the transfer
  77.  * mode.  To set up this command, you would put "GET" in the variable 'getcmd',
  78.  * and "BINARY" in the variable 'getopts'.  When the command is issued, it
  79.  * will be sent to DaFTP as "GET <filename> BINARY".
  80.  *
  81.  * It's really very simple.  If you are having problems with it, just send me
  82.  * e-mail <gandalf@hughes.net>, and we'll work it out, okay?
  83.  */
  84. sitecmd = "SITE"
  85. siteopts = ""
  86. connectcmd = "CONNECT"
  87. connectopts = "NOSCAN"
  88. portcmd = ""
  89. portopts = ""
  90. binarycmd = ""
  91. binaryopts = ""
  92. cdcmd = "CD"
  93. cdopts = "NOSCAN"
  94. lcdcmd = "LCD"
  95. lcdopts = ""
  96. getcmd = "GET"
  97. getopts = "BIN"
  98. quitcmd = "QUIT"
  99. quitopts = "FORCE"
  100.  
  101. /*
  102.  * Check if environment var for FTPCLIENT is set and use it.  The first line
  103.  * in the var would be the full path of the FTP client to use.  The second
  104.  * line, which is optional, specifies any options to use on the command line
  105.  * when starting the client program.
  106.  */
  107. if exists("ENV:FTPCLIENT") then do
  108.   if open('fc',"ENV:FTPCLIENT",'R') then do
  109.     line = strip(readln('fc'))
  110.     if length(line) > 0 then clientpath = line
  111.     line = strip(readln('fc'))
  112.     if length(line) > 0 then clientopts = line
  113.     end
  114.   call close('fc')
  115.   end
  116.  
  117. /*
  118.  * Start FTP client.
  119.  */
  120. if ~show('P',clientport) then do
  121.   say "Starting FTP client..."
  122.   address command "Run >NIL: "clientpath clientopts
  123.   end
  124.  
  125. /*
  126. if rc ~= 0 then do
  127.   say scriptname": Error" rc "trying to start FTP client '"clientname"'!"
  128.   exit 10
  129.   end
  130. */
  131.  
  132. /*
  133.  * Wait for ARexx port to appear (2 minute timeout).
  134.  */
  135. call time('R')
  136. do forever
  137.   if show('P',clientport) then leave
  138.   call Delay(250)
  139.   if time('E') > 120 then do
  140.     say scriptname": Timeout waiting for client port '"clientport"'!"
  141.     exit 10
  142.     end
  143.   end
  144.  
  145. /*
  146.  * Set up port #.
  147.  */
  148. address value(clientport)
  149. if length(ftpport) > 0 then do
  150.   ""portcmd ftpport portopts
  151.   end
  152.  
  153. /*
  154.  * Get site name & base dir.
  155.  */
  156. address AXFTP
  157. "Site"
  158. site = result
  159. "BaseDir"
  160. basedir = result
  161.  
  162. /*
  163.  * Connect to site.
  164.  */
  165. address value(clientport)
  166. ""sitecmd site siteopts
  167.  
  168. if result = "0" then do
  169.   say scriptname": Site '"site"' not found!"
  170.   address AX "ErrorReq" scriptname" ("rc"): Site '"site"' not found!"
  171.   address AXFTP "Status" scriptname" ("rc"): Site '"site"' not found!"
  172.   exit 10
  173.   end
  174.  
  175. if length(connectcmd) > 0 then do
  176.   ""connectcmd connectopts
  177.   end
  178.  
  179. if result = "0" then do
  180.   say scriptname": Unable to connect to site '"site"'!"
  181.   address AX "ErrorReq" scriptname" ("rc"): Unable to connect to site '"site"'!"
  182.   address AXFTP "Status" scriptname" ("rc"): Unable to connect to site '"site"'!"
  183.   exit 10
  184.   end
  185.  
  186. /*
  187.  * Set transfer mode.
  188.  */
  189. if length(binarycmd) > 0 then do
  190.   ""binarycmd binaryopts
  191.   end
  192.  
  193. /*
  194.  * Were files or a filelist specified?
  195.  */
  196. filelist = ""
  197. if length(files) > 0 then do
  198.   if upper(substr(files,1,5)) = "LIST=" then do
  199.     filelist = word(substr(files,6),1)
  200.     c = usefilelist(filelist)
  201.     if c ~= 0 then exit c
  202.     signal thatsit
  203.     end
  204.   else do
  205.     c = usefiles(files)
  206.     if c ~= 0 then exit c
  207.     signal thatsit
  208.     end
  209.   end
  210.  
  211. /*
  212.  * The following code controls interaction with Ax (via the ARexx ports AX and
  213.  * AXFTP) and the FTP client to grab files.
  214.  */
  215.  
  216. /* tell Ax to start FTP thread, if not running */
  217. address AX
  218. "StartFTP"
  219. if result = "0" then do
  220.   say scriptname": Unable to start Ax's FTP thread!"
  221.   exit 10
  222.   end
  223. call time('R')
  224. do forever
  225.   if show('P',"AXFTP") then leave
  226.   call Delay(250)
  227.   if time('E') > 120 then do
  228.     say scriptname": Timeout waiting for port 'AXFTP'!"
  229.     exit 10
  230.     end
  231.   end
  232.  
  233. /*
  234.  * Reset file list.
  235.  */
  236. "ResetFilelist"
  237.  
  238. /*
  239.  * Main file retrieval loop.
  240.  */
  241. do forever
  242.   address AXFTP
  243.   "GetFilename"
  244.   file = result
  245.   if file = "" then leave
  246.   "GetPath ABSOLUTE"
  247.   path = result
  248.  
  249.   address AXFTP "Status Changing remote directory to '"path"'..."
  250.   address value(clientport) ""cdcmd path cdopts
  251.   address AXFTP "Status Retrieving '"file"'..."
  252.   address value(clientport) ""getcmd file getopts
  253.   if result = "0" then do
  254.     address AXFTP "Status Unable to retrieve '"file"'!"
  255.     address AX "ErrorReq Unable to retrieve '"file"'!"
  256.     end
  257.   else do
  258.     address AXFTP
  259.     "SetFile DOWNLOADED"
  260.     "RemoveFile"
  261.     end
  262.  
  263.   "NextFile"
  264.   end
  265.  
  266. thatsit:
  267. /*
  268.  * Tell FTP client to shut down.
  269.  */
  270. if length(quitcmd) > 0 then do
  271.   address value(clientport)
  272.   ""quitcmd quitopts
  273.   end
  274.  
  275. exit 0
  276.  
  277. /*
  278.  * This procedure lets the script grab files via the FTP client using a file
  279.  * list.
  280.  */
  281. usefilelist:
  282.   parse arg flist
  283.  
  284. error = 0
  285.  
  286. if open('fl',flist,'R') then do
  287.   site = strip(readln('fl'))
  288.   basedir = strip(readln('fl'))
  289.   do while ~eof('fl')
  290.     fpath = readln('fl')
  291.     if fpath = "###" then leave
  292.     if substr(fpath,1,1) = "/" then do /* absolute pathname */
  293.       fpath = reverse(fpath)
  294.       parse fpath fname "/" fpath
  295.       fpath = reverse(fpath)
  296.       fname = reverse(fname)
  297.       end
  298.     else if index(fpath,"/") > 0 then do /* relative pathname is specified */
  299.       fpath = reverse(basedir"/"fpath)
  300.       parse fpath fname "/" fpath
  301.       fpath = reverse(fpath)
  302.       fname = reverse(fname)
  303.       end
  304.     else do
  305.       fname = fpath
  306.       fpath = basedir
  307.       end
  308.     address value(clientport)
  309.     ""cdcmd fpath cdopts
  310.     ""getcmd fname getopts
  311.     end
  312.   call close('fl')
  313.   end
  314.  
  315. return error
  316.  
  317. /*
  318.  * This procedure lets the script grab files via the FTP client using files
  319.  * specified on the command line.
  320.  */
  321. usefiles:
  322.   parse arg site basedir flist
  323.  
  324. error = 0
  325.  
  326. do forever
  327.   parse var flist fpath flist
  328.   if fpath = "" then leave
  329.   if substr(fpath,1,1) = "/" then do /* absolute pathname */
  330.     fpath = reverse(fpath)
  331.     parse fpath fname "/" fpath
  332.     fpath = reverse(fpath)
  333.     fname = reverse(fname)
  334.     end
  335.   else if index(fpath,"/") > 0 then do /* relative pathname is specified */
  336.     fpath = reverse(basedir"/"fpath)
  337.     parse fpath fname "/" fpath
  338.     fpath = reverse(fpath)
  339.     fname = reverse(fname)
  340.     end
  341.   else do
  342.     fname = fpath
  343.     fpath = basedir
  344.     end
  345.   end
  346.   address value(clientport)
  347.   ""cdcmd fpath cdopts
  348.   ""getcmd fname getopts
  349.   end
  350.  
  351. return error
  352.  
  353. syntax:
  354. err = rc
  355. parse source . . . me .
  356. address AX "ErrorReq ARexx error" err "in line" sigl "of" me"."
  357. exit
  358.  
  359. error:
  360. parse source . . . me .
  361. address AX "ErrorReq Error" rc "in line" sigl "of" me"."
  362.